接下來我們來學習一種暴力跑過所有可能的方法,DFS 深度優先搜尋。
為了方便解釋,我們的範例使用資結那堂課曾經寫過的樹喔。
import java.util.LinkedList
class Node{
var data:Int = 0
var son:LinkedList<Node> = LinkedList<Node>()
fun addSon(new_son_data:Int){
var new_son = Node()
new_son.data = new_son_data
son.add(new_son)
}
}
class Tree{
var root = Node()
}
fun main(){
var tree = Tree()
tree.root.data = 1
tree.root.addSon(2)
tree.root.addSon(3)
tree.root.son[0].addSon(4)
tree.root.son[0].addSon(5)
tree.root.son[0].son[1].addSon(6)
tree.root.son[0].son[1].addSon(7)
tree.root.son[0].son[1].addSon(8)
}
我們的這次的目標是要顯示樹上所有節點的值,深度優先搜尋的概念簡單來說就是只要樹有孩子就先看孩子,然後從左至右的遍歷。
我們通常會善用遞迴來做到這件事情,這個可能很難理解,要好好讀這段程式碼喔。
fun dfs(now:Node){
print(" ${now.data} ")
if (now.son.size!=0){
print("{")
}
for(i in 0 .. now.son.size-1){
dfs(now.son[i])
}
if (now.son.size!=0){
print("} ")
}
}
輸出結果長這樣,是不是成功print出我們的樹了呢。
1 { 2 { 4 5 { 6 7 8 } } 3 }
基本上dfs可以拿來做到各種暴力找出答案的方法,包括下棋也可以用dfs來找出最合適的走法(當然那還有其他複雜的事情要解決,比如怎麼判斷哪一步是好的)。